package com.xyh.system.controller;

import com.xyh.common.util.ResultVO;
import com.xyh.system.model.User;
import com.xyh.system.service.ILoginLogService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Author:kyle
 * @Date:2021/1/5 - 15:58
 * @Project:shirodemo
 * @Package:com.xyh.system.controller
 * @Version:1.0 登录控制器
 */
@Controller
public class LoginController {

    @Autowired
    private ILoginLogService loginLogService;

    /**
     * 跳转至登录界面
     */
    @GetMapping("/login")
    public String login() {
        return "login";
    }

    /**
     *  用户登录
     */
    @PostMapping("/login")//Spring MVC新特性，提供了对Restful风格的支持，处理post请求。
    @ResponseBody//将java对象转为json格式的数据。通常用来返回JSON数据或者是XML数据。
                //@ResponseBody是作用在方法上的，表示该方法的返回结果直接写入 HTTP response body 中，一般在异步获取数据时使用【也就是AJAX】。
    public ResultVO login(User user) {
        System.out.println("用户登录 ==== " + user);
        //获取subject
        Subject subject = SecurityUtils.getSubject();
        //封装用户信息
        UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
        //执行登录方法，只需要执行login方法，就会自动去执行UserRealm中的认证逻辑
        subject.login(token);
        ResultVO success = ResultVO.success();
        System.out.println("success = " + success);
        loginLogService.saveLoginLog(user.getUsername(),success.getStatus());
        return success;
    }

    //注销
    @GetMapping("logout")
    public String logout(){
        SecurityUtils.getSubject().logout();
        return "redirect:login";
    }
}
